<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
<script>


  // call apply bind ;
  // 1. 修改this指向
  // 2. 只有function 才能调用上面三个方法


  function A(...params) {
    console.log(this, ...params);
  }

  A.call({a: 123}, 123, 4456, 121);
  A.apply({a: 123}, [123, 123]);
  // 不会立刻调用原来的函数 返回值就是一个函数
  const fn = A.bind({a: 123}, [123, 123]);
  // bind之后再bind没有用了 call也没用 apply
  const fn1 = fn.bind({b: 456}, 20);
  // fn1.apply({b: [456]});
  new fn1();


  // 改变this的原理
  // 谁调用函数(es5的函数) this指向谁
  // es6的箭头函数 : this指向的是父级作用域
  let obj = {A, b: 456};
  obj.A();

  // call apply bind(难一点)

  function changeThis(target, ...params) {
    // 改变A里面的this指向 指向target
    // return A执行之后的返回结果
  }

  Function.prototype.myCall = myCall;

  A.myCall({},123);

  // 1. js事件循环流程图
  // 2. 牛客网 10道题
  // 3. 面向对象 new原理 instance原理 继承
  // 4. 实现myCall myApply  myBind(考虑一下怎么实现)
</script>
</body>
</html>
